package com.ftg.learn.chapter01;

import com.ftg.learn.chapter01.entity.A;
import com.ftg.learn.chapter01.entity.E;
import com.ftg.learn.chapter01.entity.PetDog;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * configuration meta 元信息
 * 1 : XML-based
 *   1.1 在一 工程里面spring的配置文件可以有多个
 *   1.2 接口是不能注入到spring容器里面的，因为我们要实例化，接口不能直接实例化
 *   1.3 抽象类 : 可以注入到容器里面，但是不能实例化，只能被其它类作为父类存在，通过获取子类的时候 ，继承这个抽象类
 *   1.4 abstract= true 声明当前为抽象类
 *   1.5 parent = dog 声明当前的父类依赖
 *   1.6 spring继承关系，要依赖java的父子关系  extends
 *   1.7 init-method  : 在java类实例化完成以后，spring ready for user以前 {生产的时候}，自动调用指定的方法
 *   1.7.1 destroy-method="abc" 表示实例被销毁时，所采用的方法
 *   1.8 scope="singleton"  scope作用域 ： spring生成指定的实例的时候 ，是单例设计模式，还是原型设计模式
 *
 *   1.9 spring容器里面大量的bean是默认按先后顺序初始化的
 *   1.10 depends-on="d1" : 当前bean依赖某一个其它实例，那么先初始依赖的实例，再初始化本身
 *   1.11 lazy-init="true" 懒加载，是容器启动时就加载，还是有人从容器里获取当前实例，再初始化
 *   1.12  primary="true" 当前bean作为调用的主实例返回，如果调用者没有指定名称 ，按类型装配时它是主要类型
 *   1.13  autowire="byName|byType" 自动装配,
 *         byName按照名称装配,表示当前bean里面的属性要与容器里面的其它id相同
 *         byType 按照容器里面相同的类型类型，对变量进行赋值操作  多态的时候会出现，找到多个实例的情况 1.12
 * 2 : annotation-base
 * 3 : java-base
 *
 * @author kangjx
 * @date 2022/11/1
 */
public class CoreExam01 {

//    就叫ioc
    public static void main(String[] args) {

        //实例化我们的springioc
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

        E e1 = (E) context.getBean("e1");
        System.out.println(e1.getF2().getFname());

//        查找方式不同
        //按名称查找 (map -> key 唯一的)
//        A a = (A) context.getBean("a");
        //按类型 map(keys,values) values里面与A.class相同 多个所以报错
//        A a1 = context.getBean(A.class);
//        // A.class  一个是自己  一个是B 自动装配 byType
//        A a = (A) context.getBean("a");
//        System.out.println(a.getA());
//        A a = context.getBean(A.class);
//        System.out.println(a.getA());

//        PetDog petDog = (PetDog) context.getBean("pet");
//        petDog.eat();

//        Object object = context.getBean("user");
//
//        User user = (User)object;
//        System.out.println(user.getUname());
//        System.out.println(user.getUno());
//
//        System.out.println(user.getClazz());
//
//        System.out.println("user1 =====> ");
//        User user1 = (User) context.getBean("user1");
//        System.out.println(user1.getUname());
//        System.out.println(user1.getUno());
//
//        System.out.println(user1.getClazz());
//
//        User user2 = (User) context.getBean("user1");
//        System.out.println(user2.getUname());
//        System.out.println(user2.getUno());
//
//        System.out.println(user2.getClazz());
//
//        System.out.println(user2.getFancy().get(0));
//        System.out.println(user2.getMaps());

    }


}
